home *** CD-ROM | disk | FTP | other *** search
/ PC Open 107 / PC Open 107 CD 1.bin / CD1 / INTERNET / COPIA SITI / Getleft / getleft-setup-notcl.exe / {app} / scripts / delay.tcl < prev    next >
Encoding:
Text File  |  2004-02-21  |  21.1 KB  |  534 lines

  1. ###############################################################################
  2. ###############################################################################
  3. ##                                  Delay.tcl
  4. ###############################################################################
  5. ###############################################################################
  6. ## This namespace is used to program delayed downloads into Getleft.
  7. ###############################################################################
  8. ###############################################################################
  9. ## (c) 2001-2003 AndrΘs Garcφa Garcφa. fandom@retemail.es
  10. ## You may distribute the contents of this file under the terms of the GPL v2
  11. ###############################################################################
  12. ###############################################################################
  13.  
  14. namespace eval Delay {
  15.  
  16. ###############################################################################
  17. # DelayedCancelDelay
  18. #    Cancel the event that would start or/and the end of a delayed download.
  19. ###############################################################################
  20. proc DelayedCancelDelay {} {
  21.     variable delayedDownload
  22.     global   getleftState
  23.  
  24.     catch {after cancel $delayedDownload(startEvent)}
  25.     catch {after cancel $delayedDownload(endEvent)}
  26.  
  27.     set getleftState(delaySet)    0
  28.     set getleftState(delayedDown) 0
  29.  
  30.     $mainWin::taskbar(delay) configure -relief flat
  31.  
  32.     return
  33. }
  34.  
  35. ###############################################################################
  36. # DelayedStartDownload
  37. #    Starts the download at the given time.
  38. ###############################################################################
  39. proc DelayedStartDownload {} {
  40.     variable delayedDownload
  41.     variable window
  42.     global getleftState
  43.  
  44.     if {$delayedDownload(noEnd)==0} {
  45.         set clicksToEnd [expr ($delayedDownload(endTime)-[clock seconds])*1000]
  46.         if {$clicksToEnd<0} {
  47.             set clicksToEnd 0
  48.         }
  49.         set delayedDownload(endEvent) \
  50.             [after $clicksToEnd Delay::DelayedEndDownload]
  51.     }
  52.     if {$delayedDownload(days)==1} {
  53.         DelayedStartTime $delayedDownload(startTime)
  54.     }
  55.     set getleftState(delayedDown) 1
  56.     mainWin::UrlListClearSel
  57.     mainWin::SetAutoDownload
  58.  
  59.     return
  60. }
  61.  
  62. ###############################################################################
  63. # DelayedEndDownload
  64. #    Ends the download in the given time.
  65. ###############################################################################
  66. proc DelayedEndDownload {} {
  67.     variable delayedDownload
  68.     global   getleftOptions
  69.  
  70.     switch $delayedDownload(how) {
  71.         0 {
  72.             ::Ventana::CancelDownloading .
  73.         }
  74.         1 {
  75.             set getleftOptions(stopFile) 1
  76.             mainWin::SetAutoDownload
  77.         }
  78.         2 {
  79.             set getleftOptions(stopPage) 1
  80.             mainWin::SetAutoDownload
  81.         }
  82.     }
  83.     if {$delayedDownload(days)==0} {
  84.         $mainWin::taskbar(delay) configure -relief flat
  85.     }
  86.  
  87.     return
  88. }
  89.  
  90. ###############################################################################
  91. # DelayedStartTime
  92. #    Calculates the time the next download will begin.
  93. #
  94. # Parameter
  95. #    The time in seconds from 01-01-1970 when the download will start.
  96. ###############################################################################
  97. proc DelayedStartTime {startTime} {
  98.     variable delayedDownload
  99.  
  100.     set now [clock seconds]
  101.     if {$delayedDownload(days)==1} {
  102.         set hour   [clock format $startTime -format "%H"]
  103.         set minute [clock format $startTime -format "%M"]
  104.         set startTime 9999999999
  105.         foreach day [list monday tuesday  wednesday thursday \
  106.                           friday saturday sunday] {
  107.             if {$delayedDownload($day)==1} {
  108.                 set startTmp [clock scan "$day $hour:$minute"]
  109.                 if {$startTmp<$now} {
  110.                     set startTmp [expr $startTmp+7*24*3600]
  111.                 }
  112.                 if {($startTmp<=$startTime)&&($startTmp>$now)} {
  113.                     set startTime $startTmp
  114.                 }
  115.             }
  116.         }
  117.     }
  118.     set delayedDownload(startTime) $startTime
  119.     DelayedSetStartTime
  120.  
  121.     return
  122. }
  123.  
  124. ###############################################################################
  125. # DelayedSetStartTime
  126. #    Given the time when to start, this procedure will create the event to
  127. #    start the download at that time.
  128. ###############################################################################
  129. proc DelayedSetStartTime {} {
  130.     variable delayedDownload
  131.  
  132.     set clicksToStart [expr ($delayedDownload(startTime)-[clock seconds])*1000]
  133.     # This may happen if we closed Getleft and we are running it again.
  134.     if {$clicksToStart<0} {
  135.         if {$delayedDownload(days)==1} {
  136.             DelayedStartTime $delayedDownload(startTime)
  137.         }
  138.         return
  139.     }        
  140.     set delayedDownload(startEvent)  \
  141.             [after $clicksToStart Delay::DelayedStartDownload]
  142.  
  143.     return 
  144. }
  145.  
  146. ###############################################################################
  147. # DelayedEndTime
  148. #    Calculates the time the next download will stop.
  149. #
  150. # Parametes
  151. #    The hour and the minute of the time and the start time.
  152. #
  153. # Returns:
  154. #    The time in seconds from 01-01-1970
  155. ###############################################################################
  156. proc DelayedEndTime {hour minute startTime} {
  157.     variable delayedDownload
  158.  
  159.     set endTime [clock scan "today $hour:$minute"]
  160.     while {$startTime>=$endTime} {
  161.         set endTime [expr $endTime + 3600*24]
  162.     }
  163.     return $endTime
  164. }
  165.  
  166. ###############################################################################
  167. # DelayedCheckTime
  168. #    Checks whether the given time makes sense or not.
  169. #
  170. # Parametes
  171. #    The hour and the minute of the time to check.
  172. #
  173. # Returns:
  174. #    '0' makes sense, '1' doesn't.
  175. ###############################################################################
  176. proc DelayedCheckTime {hour minute} {
  177.  
  178.     if {(![regexp {^[0-9]+$} $hour])||(![regexp {^[0-9]+$} $minute])} {
  179.         return 1
  180.     }
  181.     if {($hour<0)||($hour>23)||($minute<0)||($minute>59)} {
  182.         return 1
  183.     }
  184.  
  185.     return 0
  186. }
  187.  
  188. ###############################################################################
  189. # DelayedActivateEndTime
  190. #    Activates or deactivates the spinboxes with the time to finish downloading
  191. ###############################################################################
  192. proc DelayedActivateEndTime {} {
  193.     variable delayedDownloadTemp
  194.     variable window
  195.  
  196.     if {$delayedDownloadTemp(noEnd)==1} {
  197.         CuadroSpin::EnableSpin $window(endHour)   disable
  198.         CuadroSpin::EnableSpin $window(endMinute) disable
  199.     } else {
  200.         CuadroSpin::EnableSpin $window(endHour)   normal
  201.         CuadroSpin::EnableSpin $window(endMinute) normal
  202.     }
  203.  
  204.     return
  205. }
  206.  
  207. ###############################################################################
  208. # DelayedActivateDays
  209. #    Activates or deactivates the 'days' buttons.
  210. ###############################################################################
  211. proc DelayedActivateDays {} {
  212.     variable delayedDownloadTemp
  213.     variable dayButton
  214.  
  215.     if {$delayedDownloadTemp(days)==0} {
  216.         $dayButton(monday)    configure -state disable
  217.         $dayButton(tuesday)   configure -state disable
  218.         $dayButton(wednesday) configure -state disable
  219.         $dayButton(thursday)  configure -state disable
  220.         $dayButton(friday)    configure -state disable
  221.         $dayButton(saturday)  configure -state disable
  222.         $dayButton(sunday)    configure -state disable
  223.     } else {
  224.         if {[$dayButton(monday) cget -state]!="normal"} {
  225.             $dayButton(monday)    configure -state normal
  226.             $dayButton(tuesday)   configure -state normal
  227.             $dayButton(wednesday) configure -state normal
  228.             $dayButton(thursday)  configure -state normal
  229.             $dayButton(friday)    configure -state normal
  230.             $dayButton(saturday)  configure -state normal
  231.             $dayButton(sunday)    configure -state normal
  232.         }
  233.     }
  234.     return
  235. }
  236.  
  237. ###############################################################################
  238. # DelayedActivateStop
  239. #    Activates or deactivates the 'days' buttons.
  240. ###############################################################################
  241. proc DelayedActivateStop {} {
  242.     variable delayedDownloadTemp
  243.     variable stopButton
  244.  
  245.     if {$delayedDownloadTemp(noEnd)==0} {
  246.         if {[$stopButton(inme) cget -state]!="normal"} {
  247.             $stopButton(inme) configure -state normal
  248.             $stopButton(file) configure -state normal
  249.             $stopButton(page) configure -state normal
  250.         }
  251.     } else {
  252.         $stopButton(inme) configure -state disable
  253.         $stopButton(file) configure -state disable
  254.         $stopButton(page) configure -state disable
  255.     }
  256.     return
  257. }
  258.  
  259. ###############################################################################
  260. # DelayedDownloadWindow
  261. #    Creates the dialog to define when to start a download.
  262. ###############################################################################
  263. proc DelayedDownloadWindow {} {
  264.     global labelDialogs labelTitles labelFrames getleftState getleftOptions
  265.     global indexButtons indexDialogs
  266.     variable delayedDownloadTemp
  267.     variable dayButton
  268.     variable stopButton
  269.     variable window
  270.  
  271.     if {[winfo exists .delayedDown]} {
  272.         raise .delayedDown .
  273.         return
  274.     }
  275.  
  276.     set win [toplevel .delayedDown]
  277.     wm title $win $labelTitles(delayedDown)
  278.     wm resizable $win 0 0
  279.  
  280.     set coord(x) [winfo rootx .]
  281.     set coord(y) [winfo rooty .]
  282.     wm geometry $win +[expr {$coord(x)+100}]+[expr {$coord(y)+15}]
  283.  
  284.     set extFrame [frame $win.extFrame]
  285.     set intFrame [frame $extFrame.intFrame]
  286.  
  287.     set timeFrame [fl::FrameLabel $intFrame.time -bd 2 -relief groove           \
  288.             -textvariable labelFrames(time)]
  289.     set startLabel  [label $timeFrame.startLabel -textvariable labelDialogs(begin)]
  290.     set startHour   [CuadroSpin::CuadroSpin $timeFrame.startHour                \
  291.             -default 0 -min 0 -max 23 -width 3                                  \
  292.             -bg $getleftOptions(bg) -fg $getleftOptions(fg)]
  293.     set startMinute [CuadroSpin::CuadroSpin $timeFrame.startMinute              \
  294.             -default 0 -min 0 -max 59 -width 3 -incr 5                          \
  295.             -bg $getleftOptions(bg) -fg $getleftOptions(fg)]
  296.     set endLabel    [label $timeFrame.endLabel -textvariable labelDialogs(end)]
  297.     set endHour     [CuadroSpin::CuadroSpin $timeFrame.endHour                  \
  298.             -default 0 -min 0 -max 23 -width 3 -disbg $getleftOptions(disBg)    \
  299.             -bg $getleftOptions(bg) -fg $getleftOptions(fg)                     \
  300.             -disfg $getleftOptions(disFg)]
  301.     set endMinute   [CuadroSpin::CuadroSpin $timeFrame.endMinute                \
  302.             -default 0 -min 0 -max 59 -width 3 -incr 5                          \
  303.             -disbg $getleftOptions(disBg) -disfg $getleftOptions(disFg)         \
  304.             -bg $getleftOptions(bg) -fg $getleftOptions(fg)]
  305.     set noEnd [underButton::UnderButton $timeFrame.noEnd -buttontype checkbutton\
  306.             -textvariable labelDialogs(noLimit) -under $indexDialogs(noLimit)   \
  307.             -variable Delay::delayedDownloadTemp(noEnd) -command "
  308.                 Delay::DelayedActivateEndTime
  309.                 Delay::DelayedActivateStop
  310.             "]
  311.     if {$delayedDownloadTemp(noEnd)==""} {
  312.         set delayedDownloadTemp(noEnd) 1
  313.     }
  314.     if {![catch {clock format $delayedDownloadTemp(startTime)}]} {
  315.         set CuadroSpin::CuadroSpins($startHour)   \
  316.                 [clock format $delayedDownloadTemp(startTime) -format "%H"]
  317.         set CuadroSpin::CuadroSpins($startMinute) \
  318.                 [clock format $delayedDownloadTemp(startTime) -format "%M"]
  319.     }
  320.     if {![catch {clock format $delayedDownloadTemp(endTime)}]} {
  321.         set CuadroSpin::CuadroSpins($endHour)                                  \
  322.                 [clock format $delayedDownloadTemp(endTime) -format "%H"]
  323.         set CuadroSpin::CuadroSpins($endMinute)                                \
  324.                 [clock format $delayedDownloadTemp(endTime) -format "%M"]
  325.     }
  326.  
  327.     set window(win)         $win
  328.     set window(startHour)   $startHour
  329.     set window(startMinute) $startMinute
  330.     set window(endHour)     $endHour
  331.     set window(endMinute)   $endMinute
  332.  
  333.     DelayedActivateEndTime
  334.  
  335.     set howFrame  [fl::FrameLabel $intFrame.how  -bd 2 -relief groove          \
  336.             -textvariable labelFrames(stop)]
  337.     set stopButton(inme) [underButton::UnderButton $howFrame.inme              \
  338.             -textvariable labelDialogs(inme)      -buttontype radiobutton      \
  339.             -variable Delay::delayedDownloadTemp(how) -value 0                 \
  340.             -under $indexDialogs(inme)] 
  341.     set stopButton(file) [underButton::UnderButton $howFrame.file              \
  342.             -textvariable labelDialogs(afterFile) -buttontype radiobutton      \
  343.             -variable Delay::delayedDownloadTemp(how) -value 1                 \
  344.             -under $indexDialogs(afterFile)]
  345.     set stopButton(page) [underButton::UnderButton $howFrame.page              \
  346.             -textvariable labelDialogs(afterPage) -buttontype radiobutton      \
  347.             -variable Delay::delayedDownloadTemp(how) -value 2                 \
  348.             -under $indexDialogs(afterPage)]
  349.     if {$delayedDownloadTemp(how)==""} {
  350.         set delayedDownloadTemp(how) 1
  351.     }
  352.     DelayedActivateStop
  353.  
  354.     set daysFrame [fl::FrameLabel $intFrame.days -bd 2 -relief groove          \
  355.             -textvariable labelFrames(days)]
  356.     set today [underButton::UnderButton $daysFrame.today -buttontype radiobutton\
  357.             -textvariable labelDialogs(onlyToday)                              \
  358.             -variable Delay::delayedDownloadTemp(days) -value 0                \
  359.             -buttontype radiobutton -under $indexDialogs(onlyToday)            \
  360.             -command Delay::DelayedActivateDays]
  361.     set on    [underButton::UnderButton $daysFrame.on -buttontype radiobutton  \
  362.             -textvariable labelDialogs(on) -under $indexDialogs(on)            \
  363.             -variable Delay::delayedDownloadTemp(days) -value 1                \
  364.             -command Delay::DelayedActivateDays]
  365.     if {$delayedDownloadTemp(days)==""} {
  366.         set delayedDownloadTemp(days) 0
  367.     }
  368.  
  369.     set dayButton(monday)    [underButton::UnderButton $daysFrame.monday       \
  370.             -textvariable labelDialogs(monday)    -buttontype checkbutton      \
  371.             -variable Delay::delayedDownloadTemp(monday)                       \
  372.             -under $indexDialogs(monday)]
  373.     set dayButton(tuesday)   [underButton::UnderButton $daysFrame.tuesday      \
  374.             -textvariable labelDialogs(tuesday)   -buttontype checkbutton      \
  375.             -variable Delay::delayedDownloadTemp(tuesday)                      \
  376.             -under $indexDialogs(tuesday)]
  377.     set dayButton(wednesday) [underButton::UnderButton $daysFrame.wednesday    \
  378.             -textvariable labelDialogs(wednesday) -buttontype checkbutton      \
  379.             -variable Delay::delayedDownloadTemp(wednesday)                    \
  380.             -under $indexDialogs(wednesday)]
  381.     set dayButton(thursday)  [underButton::UnderButton $daysFrame.thursday     \
  382.             -textvariable labelDialogs(thursday)  -buttontype checkbutton      \
  383.             -variable Delay::delayedDownloadTemp(thursday)                     \
  384.             -under $indexDialogs(thursday)]
  385.     set dayButton(friday)    [underButton::UnderButton $daysFrame.friday       \
  386.             -textvariable labelDialogs(friday)    -buttontype checkbutton      \
  387.             -variable Delay::delayedDownloadTemp(friday)                       \
  388.             -under $indexDialogs(friday)]
  389.     set dayButton(saturday)  [underButton::UnderButton $daysFrame.saturday     \
  390.             -textvariable labelDialogs(saturday)  -buttontype checkbutton      \
  391.             -variable Delay::delayedDownloadTemp(saturday)                     \
  392.             -under $indexDialogs(saturday)]
  393.     set dayButton(sunday)    [underButton::UnderButton $daysFrame.sunday       \
  394.             -textvariable labelDialogs(sunday)    -buttontype checkbutton      \
  395.             -variable Delay::delayedDownloadTemp(sunday)                       \
  396.             -under $indexDialogs(sunday)]
  397.     DelayedActivateDays
  398.  
  399.     set buttonFrame [frame $win.buttonFrame]
  400.     set accept [underButton::UnderButton $buttonFrame.accept                   \
  401.         -buttontype button -textvariable labelButtons(ok)                      \
  402.         -width 8 -command "Delay::DelayedDownloadControl 1"                    \
  403.         -under $indexButtons(ok)]
  404.     set cancel [underButton::UnderButton $buttonFrame.cancel                   \
  405.         -buttontype button -textvariable labelButtons(cancel)                  \
  406.         -width 8 -command "Delay::DelayedDownloadControl 0"                    \
  407.         -under $indexButtons(cancel)]
  408.     set clear  [underButton::UnderButton $buttonFrame.clear                    \
  409.         -buttontype button -textvariable labelButtons(clear)                   \
  410.         -width 8 -command "Delay::DelayedDownloadControl 2"                    \
  411.         -under $indexButtons(clear)]
  412.  
  413.     pack $extFrame -padx 5
  414.     pack $intFrame 
  415.     grid $timeFrame $howFrame     -sticky news -ipadx 7 -ipady 7 -padx 5 -pady 10
  416.     grid $daysFrame -columnspan 2 -sticky news -ipadx 7 -ipady 7 -padx 5
  417.  
  418.     grid $startLabel $startHour $startMinute -padx 5 -pady 3 -sticky w
  419.     grid $endLabel   $endHour   $endMinute   -padx 5 -pady 3 -sticky w
  420.     grid $noEnd -columnspan 3
  421.  
  422.     grid $stopButton(inme) -sticky w
  423.     grid $stopButton(file) -sticky w
  424.     grid $stopButton(page) -sticky w
  425.  
  426.     grid $today $on  -sticky w
  427.     grid $dayButton(monday)    $dayButton(tuesday)                     -sticky w
  428.     grid $dayButton(wednesday) $dayButton(thursday) $dayButton(friday) -sticky w
  429.     grid $dayButton(saturday)  -row 3 -column 1 -sticky w
  430.     grid $dayButton(sunday)    -row 3 -column 2 -sticky w
  431.  
  432.     pack $buttonFrame           -padx 7 -pady 5   -side right
  433.     pack $cancel $accept $clear -padx 3 -side right
  434.  
  435.     bind $win <Escape> "$cancel invoke"
  436.  
  437.     if {$getleftState(delaySet)==0} {
  438.         $clear configure -state disable
  439.     } else {
  440.         $clear configure -state normal
  441.     }
  442.  
  443.     return
  444. }
  445.  
  446. ###############################################################################
  447. # DelayedDownloadControl
  448. #    Checks that the data entered in the dialog is consistent.
  449. #
  450. # Parameter
  451. #    '1' if the user accept the data, '0' if the dialog was cancelled.
  452. ###############################################################################
  453. proc DelayedDownloadControl {done} {
  454.     global labelTitles labelMessages getleftState
  455.     variable window
  456.     variable delayedDownload
  457.     variable delayedDownloadTemp
  458.  
  459.     if {$done==1} {
  460.         set startHour   $CuadroSpin::CuadroSpins($window(startHour))
  461.         set startMinute $CuadroSpin::CuadroSpins($window(startMinute))
  462.  
  463.         if {[DelayedCheckTime $startHour $startMinute]==1} {
  464.             tk_messageBox -title $labelTitles(error) -parent $window(win)     \
  465.                     -message $labelMessages(wrongStart)     -type ok 
  466.             return
  467.         }
  468.         if {$delayedDownloadTemp(noEnd)==0} {
  469.             set endHour   $CuadroSpin::CuadroSpins($window(endHour))
  470.             set endMinute $CuadroSpin::CuadroSpins($window(endMinute))
  471.  
  472.             if {[DelayedCheckTime $endHour $endMinute]==1} {
  473.                 tk_messageBox -title $labelTitles(error) -parent $window(win) \
  474.                         -message $labelMessages(wrongStart) -type ok 
  475.                 return
  476.             }
  477.         }
  478.         if {$delayedDownloadTemp(days)==1} {
  479.             if {($delayedDownloadTemp(monday)==0)      &&($delayedDownloadTemp(tuesday)==0) \
  480.                  &&($delayedDownloadTemp(wednesday)==0)&&($delayedDownloadTemp(thursday)==0)\
  481.                  &&($delayedDownloadTemp(friday)==0)   &&($delayedDownloadTemp(saturday)==0)\
  482.                  &&($delayedDownloadTemp(sunday)==0)} {
  483.                 tk_messageBox -title $labelTitles(error)   -parent $window(win)             \
  484.                         -message $labelMessages(whichDays) -type ok 
  485.                 return
  486.             }
  487.         }
  488.     }
  489.  
  490.     destroy $window(win)
  491.  
  492.     if {$done==0} return
  493.  
  494.     if {$done==2} {
  495.         DelayedCancelDelay
  496.         return
  497.     }
  498.     DelayedCancelDelay
  499.     array set delayedDownload [array get delayedDownloadTemp]
  500.     set startTime [clock scan "today $startHour:$startMinute"]
  501.     set now [clock seconds]
  502.     if {$startTime<$now} {
  503.         set startTime [expr $startTime+24*3600]
  504.     }
  505.     DelayedStartTime $startTime
  506.     if {$delayedDownload(noEnd)==0} {
  507.         set delayedDownload(endTime)         \
  508.                 [DelayedEndTime $endHour $endMinute $delayedDownload(startTime)]
  509.     }
  510.  
  511.     $mainWin::taskbar(delay) configure -relief sunken
  512.     set getleftState(delaySet) 1
  513.  
  514.     return
  515. }
  516.  
  517. ###############################################################################
  518. # DelayedDownload
  519. #    Takes care of all the trivia of defining a delayed download.
  520. ###############################################################################
  521. proc DelayedDownload {} {
  522.     variable delayedDownloadTemp
  523.     variable delayedDownload
  524.  
  525.     catch {unset delayedDownloadTemp}
  526.     array set delayedDownloadTemp [array get delayedDownload]
  527.  
  528.     DelayedDownloadWindow
  529.  
  530.     return
  531. }
  532.  
  533. }
  534.